const AppError = require('../utils/appError')
const Article = require('../models/article')
const catchAsync = require('../utils/catchAsync')

/**
 * 创建文章
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 * @type {(function(*, *, *): void)|*}
 */
exports.addArticle = catchAsync(async (req, res, next) => {
  const article = new Article(req.body)

  const savedArticle = await article.save()
  await savedArticle.populate(['category', 'tags'])

  res.status(201).json({
    status: 'success',
    message: '文章创建成功',
    data: savedArticle,
  })
})

/**
 * 获取文章列表（支持分页、分类筛选、标签筛选）
 */
exports.pageArticle = catchAsync(async (req, res, next) => {
  const currentPage = +req.query.currentPage || 1
  const pageSize = +req.query.pageSize || 10
  const skip = (currentPage - 1) * pageSize

  const query = {}

  // 按分类筛选
  if (req.query.categoryId) {
    query.category = req.query.categoryId
  }

  // 按标签筛选
  if (req.query.tagId) {
    query.tags = req.query.tagId // MongoDB 会自动匹配数组中的 ObjectId
  }

  // 并发执行两个查询：列表 + 总数
  const [list, total] = await Promise.all([
    Article.find(query)
      .populate(['category', 'tags'])
      .sort({ createdAt: -1 })
      .skip(skip)
      .limit(pageSize),
    Article.countDocuments(query),
  ])

  res.status(200).json({
    status: 'success',
    data: {
      list,
      total,
      pageSize,
      currentPage,
    },
  })
})

/**
 * 根据 ID 获取单个文章
 * @type {(function(*, *, *): void)|*}
 */
exports.getArticle = catchAsync(async (req, res, next) => {
  const article = await Article.findById(req.params.id).populate(['category', 'tags'])

  if (!article) {
    return next(new AppError('文章不存在', 404))
  }

  res.status(200).json({
    status: 'success',
    data: article,
  })
})

/**
 * 更新文章
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 */
exports.updateArticle = catchAsync(async (req, res, next) => {
  const article = await Article.findById(req.params.id)

  if (!article) {
    return next(new AppError('文章不存在', 404))
  }

  // 更新数据（只更新传入的字段）
  Object.assign(article, req.body)

  const updatedArticle = await article.save()
  await updatedArticle.populate(['category', 'tags'])

  res.status(200).json({
    status: 'success',
    message: '文章更新成功',
    data: updatedArticle,
  })
})

/**
 * 删除文章
 * 需要--拦截器中间(提前获取到user和token信息)，权限验证
 * @type {(function(*, *, *): void)|*}
 */
exports.deleteArticle = catchAsync(async (req, res, next) => {
  const article = await Article.findByIdAndDelete(req.params.id)

  if (!article) {
    return next(new AppError('文章不存在', 404))
  }

  res.status(200).json({
    status: 'success',
    message: '文章删除成功',
    data: null,
  })
})

/**
 * 获取最近发布的前三篇文章
 * 仅返回 title 和发布时间（createdAt）
 * @type {(function(*, *, *): void)|*}
 */
exports.getLatestArticles = catchAsync(async (req, res, next) => {
  const latestArticles = await Article.find({}, 'title createdAt') // 只选择两个字段
    .sort({ createdAt: -1 }) // 按发布时间倒序（最新的在前）
    .limit(3) // 仅取前3条

  res.status(200).json({
    status: 'success',
    message: '获取最近发布的文章成功',
    data: latestArticles,
  })
})
